首页 > 试题广场 >

翻转链表

[编程题]翻转链表
  • 热度指数:5702 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

对于一个链表 L: L0→L1→…→Ln-1→Ln,
将其翻转成 L0→Ln→L1→Ln-1→L2→Ln-2→…

输入是一串数字,请将其转换成单链表格式之后,再进行操作


输入描述:
一串数字,用逗号分隔


输出描述:
一串数字,用逗号分隔
示例1

输入

1,2,3,4,5

输出

1,5,2,4,3

备注:
数组长度不超过100000
// 递归的爆栈的做法

const readline = require("readline")

const r1 = readline.createInterface({
    input: process.stdin,
    output: process.stdout
})

const LinkNode = function (val) {
    this.val = val 
    this.next = null
}

const arrToLinkList = function(arr) {
    let dummyNode = new LinkNode(0)
    
    let prevNode = dummyNode
    
    for(let i = 0; i < arr.length; i++) {
        
        const curNode = new LinkNode(arr[i])
        
        // 连接节点
        prevNode.next = curNode
        
        prevNode = curNode
    }
    
    return dummyNode.next
}


const reverseLinkList = function (head) {
    let prevNode = head;
    
    const recurse = function (curNode) {
     
        if(!curNode) return false
        
        if(recurse(curNode.next)) return true
        
        // 提前结束recurse这个函数的条件是什么?
        if(prevNode === curNode) {
            // 断开prevNode和其下面的联系
            prevNode.next = null
            return true
        }
        
 
        // 切断当前节点和下一个节点的联系
        curNode.next = null
        
        // 建立新的联系前,先保存prevNode的下一个节点
        let temp = prevNode.next
        
        // 建立新的联系
        prevNode.next = curNode
        
        // 当前节点和prevNode的下一个节点连接起来
        curNode.next = temp
        
        // 更新prevNode的值
        prevNode = temp
        
        return false
    }
    
    recurse(prevNode)
}

r1.on("line", function (line) {
    const lineData = line.split(",")
    
    //将数组转化为链表
    let  head = arrToLinkList(lineData)
    
    // 进行反转链表的操作
    reverseLinkList(head)
    
    // 遍历链表
//     while(head) {
//         console.log(head.val)
        
//         head = head.next
//     }
  
    let strArr = []
    while(head) {
        strArr.push(head.val)
        
        head = head.next
    }
    
    // 我现在会输入读取,但是,如何按照它的结果输出呢?
    console.log(strArr.join(","))
    

})

发表于 2022-05-13 17:09:21 回复(0)